package com.pany.kotlin

/*
*Author:zhang
*Date:2022/4/19
*类 对象
*
* abstract 抽象类
* final 无法继承,默认就是final ,需要添加 open
* enum 枚举类
* open
* annotation  注解类
*
* 修饰
* private public protected
* internal 同一个模块中可见,包名里
*
*
*
*/
fun main(args: Array<String>) {


    var person1 = Person("leo")
    person1.eat()
    println(" lastName is ${person1.lastName}")

    println("-------------------")

    val out1 = Outer()
    val in1 = Outer.In() //

    println("----------------2---")
//    val demo = Outer2.Inner().xxy() // 要实例化一下,内部类作为成员变量用
    val demo = Outer2().Inner().xxy()
    println(demo)
    var demo2 = Outer2().Inner().innerTest()
    println(" demo22 ==  ")
    println("----------------33---")
    var test2 = MyTest()
    test2.setInterFace(object : TestInterFace {
        override fun test() {

            println(" 接口 ")
        }

    })


}

//空的类
class Eempty

class test() {

}

//constructor 构造函数
class Person constructor(firstName: String) {
    //先初始化 调用,就是生成对象的时候
    init {
        println(" I love china")

    }

    //关键字lateinit  后加载,想加载的时候在用
    lateinit var t: test

    var a: Int? = 0
    val c: Int = 7

    var lastName: String = " zhang"
        get() = field.toUpperCase() // field 和 it 指向上面的变量
        set

    var num: Int = 100
        get() = field
        set(value) {
            if (value < 10) {
                field = value
            } else {
                field = -1
            }

        }
    var height: Float = 123.3F
        private set // 设置这个 变量 height 为私有的,不能赋值了

    fun eat() {
        println(" leo is eatting")
    }
}

// 抽象类 实现继承一个类需要open 实现方法也需要 open
abstract class Car : Base() {
    override abstract fun drive()

}

open class Base {
    open fun drive() {

    }

}

// 嵌套
class Outer {
    private val num: Int = 1

    class In {

        fun xxy() {
            println("222")
        }
    }
}

// 内部类
class Outer2 {
    var num: Int = 1

    inner class Inner {
        fun xxy() = num
        fun innerTest() {
            var out2 = this@Outer2 // 可以获取外部类的成员变量
            var o2 = out2.num
            println("o2 ==== ${o2 + 6}")
        }
    }
}

// 匿名内部类
class MyTest {

    var strt = "ni he shui"
    fun setInterFace(test: TestInterFace) { // test 就是传入的内部类 调用方法时就实现这个接口
        test.test()
    }
}

// 接口
interface TestInterFace {
    fun test()
}

